 package com.sx.blog.common.util;

 import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

 /**
 *
 /**
 * @author 李金鑫
 * @date 2020/01/21
 
 * Cookie 工具类
 *
 */
 public final class CookieUtils {

 protected static final Logger logger = LoggerFactory.getLogger(CookieUtils.class);

 /**
 * 得到Cookie的值, 不编码
 *
 * @param request
 * @param cookieName
 * @return
 */
 public static String getCookieValue(HttpServletRequest request, String cookieName) {
 return getCookieValue(request, cookieName, false);
 }

 /**
 * 得到Cookie的值,
 *
 * @param request
 * @param cookieName
 * @return
 */
 public static String getCookieValue(HttpServletRequest request, String cookieName, boolean isDecoder) {
 Cookie[] cookieList = request.getCookies();
 if (cookieList == null || cookieName == null){
 return null;
 }
 String retValue = null;
 try {
 for (int i = 0; i < cookieList.length; i++) {
 if (cookieList[i].getName().equals(cookieName)) {
 if (isDecoder) {
 retValue = URLDecoder.decode(cookieList[i].getValue(), "UTF-8");
 } else {
 retValue = cookieList[i].getValue();
 }
 break;
 }
 }
 } catch (UnsupportedEncodingException e) {
 logger.error("Cookie Decode Error.", e);
 }
 return retValue;
 }

 /**
 * 得到Cookie的值,
 *
 * @param request
 * @param cookieName
 * @return
 */
 public static String getCookieValue(HttpServletRequest request, String cookieName, String encodeString) {
 Cookie[] cookieList = request.getCookies();
 if (cookieList == null || cookieName == null){
 return null;
 }
 String retValue = null;
 try {
 for (int i = 0; i < cookieList.length; i++) {
 if (cookieList[i].getName().equals(cookieName)) {
 retValue = URLDecoder.decode(cookieList[i].getValue(), encodeString);
 break;
 }
 }
 } catch (UnsupportedEncodingException e) {
 logger.error("Cookie Decode Error.", e);
 }
 return retValue;
 }

 /**
 * 设置Cookie的值 不设置生效时间默认浏览器关闭即失效,也不编码
 */
 public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName, String cookieValue) {
 setCookie(request, response, cookieName, cookieValue, -1);
 }

 /**
 * 设置Cookie的值 在指定时间内生效,但不编码
 */
 public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName, String cookieValue, int cookieMaxage) {
 setCookie(request, response, cookieName, cookieValue, cookieMaxage, false);
 }

 /**
 * 设置Cookie的值 不设置生效时间,但编码
 */
 public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName, String cookieValue, boolean isEncode) {
 setCookie(request, response, cookieName, cookieValue, -1, isEncode);
 }

 /**
 * 设置Cookie的值 在指定时间内生效, 编码参数
 */
 public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName, String cookieValue, int cookieMaxage, boolean isEncode) {
 doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, isEncode);
 }

 /**
 * 设置Cookie的值 在指定时间内生效, 编码参数(指定编码)
 */
 public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName, String cookieValue, int cookieMaxage, String encodeString) {
 doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, encodeString);
 }

 /**
 * 删除Cookie带cookie域名
 */
 public static void deleteCookie(HttpServletRequest request, HttpServletResponse response, String cookieName) {
 doSetCookie(request, response, cookieName, "", -1, false);
 }

 /**
 * 设置Cookie的值，并使其在指定时间内生效,默认域名为"/"
 *
 * @param cookieMaxage
 * cookie生效的最大秒数
 */
 private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response, String cookieName, String cookieValue, int cookieMaxage, boolean isEncode) {
 try {
 if (cookieValue == null) {
 cookieValue = "";
 } else if (isEncode) {
 cookieValue = URLEncoder.encode(cookieValue, "utf-8");
 }
 Cookie cookie = new Cookie(cookieName, cookieValue);
 if (cookieMaxage > 0)
 cookie.setMaxAge(cookieMaxage);
 if (null != request)// 设置域名的cookie
 cookie.setDomain(getDomainName(request));
 cookie.setPath("/");
 response.addCookie(cookie);
 } catch (Exception e) {
 logger.error("Cookie Encode Error.", e);
 }
 }

 /**
 * 设置Cookie的值，并使其在指定时间内生效
 *
 * @param cookieMaxage
 * cookie生效的最大秒数
 */
 private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response, String cookieName, String cookieValue, int cookieMaxage, String encodeString) {
 try {
 if (cookieValue == null) {
 cookieValue = "";
 } else {
 cookieValue = URLEncoder.encode(cookieValue, encodeString);
 }
 Cookie cookie = new Cookie(cookieName, cookieValue);
 if (cookieMaxage > 0)
 cookie.setMaxAge(cookieMaxage);
 if (null != request)// 设置域名的cookie
 cookie.setDomain(getDomainName(request));
 cookie.setPath("/");
 response.addCookie(cookie);
 } catch (Exception e) {
 logger.error("Cookie Encode Error.", e);
 }
 }

 /**
 * 得到cookie的域名
 */
 private static final String getDomainName(HttpServletRequest request) {
 String domainName = null;

 String serverName = request.getRequestURL().toString();
 if (serverName == null || serverName.equals("")) {
 domainName = "";
 } else {
 serverName = serverName.toLowerCase();
 serverName = serverName.substring(7);
 final int end = serverName.indexOf("/");
 serverName = serverName.substring(0, end);
 final String[] domains = serverName.split("\\.");
 int len = domains.length;
 if (len > 3) {
 // www.xxx.com.cn
 domainName = "." + domains[len - 3] + "." + domains[len - 2] + "." + domains[len - 1];
 } else if (len <= 3 && len > 1) {
 // xxx.com or xxx.cn
 domainName = "." + domains[len - 2] + "." + domains[len - 1];
 } else {
 domainName = serverName;
 }
 }

 if (domainName != null && domainName.indexOf(":") > 0) {
 String[] ary = domainName.split("\\:");
 domainName = ary[0];
 }
 return domainName;
 }

 }
